package br.com.toscano.contpedido.persistence;

import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.persistence.Query;

import br.com.toscano.contpedido.domain.ObjetoAbstrato;
import br.com.toscano.contpedido.domain.Pedido;
import br.com.toscano.contpedido.domain.StatusPedido;
import br.gov.frameworkdemoiselle.stereotype.PersistenceController;
import br.gov.frameworkdemoiselle.template.JPACrud;

@PersistenceController
public class PedidoDAO extends JPACrud<Pedido, Long> {

	private static final long serialVersionUID = 1L;
	
	public void registrarCancelamento(Long idPedido) {
		StatusPedido sp = new StatusPedido();
		sp.setId(StatusPedido.CANCELADO);
		
		Pedido pedido = this.load(idPedido);
		pedido.setStatusPedido(sp);

		this.update(pedido);
	}

	public void registrarPagamento(Long idPedido) {
		StatusPedido sp = new StatusPedido();
		sp.setId(StatusPedido.PAGO);
		
		Pedido pedido = this.load(idPedido);
		pedido.setStatusPedido(sp);

		this.update(pedido);
	}

	public void registrarProducao(Long idPedido) {
		Pedido pedido = this.load(idPedido);
		pedido.setProduzido(Pedido.SIM);
		this.update(pedido);
	}

	public void registrarEngregue(Long idPedido) {
		StatusPedido sp = new StatusPedido();
		sp.setId(StatusPedido.ENTREGUE);
		
		Pedido pedido = this.load(idPedido);
		pedido.setDataEntrega(new Date());
		pedido.setStatusPedido(sp);

		this.update(pedido);
	}
	

	public void registrarConferido(Long idPedido) {
		StatusPedido sp = new StatusPedido();
		sp.setId(StatusPedido.CONFERIDO);
		
		Pedido pedido = this.load(idPedido);
		pedido.setDataEntrega(new Date());
		pedido.setStatusPedido(sp);

		this.update(pedido);
	}
	
	public List<Pedido> consultarPedidos(Boolean soExibePedidosAgendados, Long idPedido, Long idCliente, Long idUsuario, Long idStatusPedido, Boolean produzido, Date dataCadastroInicial, Date dataCadastroFinal, Date dataEntregaInicial, Date dataEntregaFinal, Boolean exibirCancelados, Byte tipoPagamento) {

		String hql = "from "+Pedido.class.getSimpleName()+" obj ";
		boolean jaTemRestricao = false;
		if (soExibePedidosAgendados !=  null ) {
			if(jaTemRestricao) {
				hql = hql + " and ";
			} else {
				hql = hql + " where ";
			}
			if (soExibePedidosAgendados) {
				hql = hql + " obj.dataProducao is not null ";
			} else {
				hql = hql + " obj.dataProducao is null  ";
			}
			jaTemRestricao = true;
		}
		if (produzido !=  null ) {
			if(jaTemRestricao) {
				hql = hql + " and ";
			} else {
				hql = hql + " where ";
			}
			if (produzido) {
				hql = hql + " obj.produzido = " + ObjetoAbstrato.SIM;
			} else {
				hql = hql + " (obj.produzido = " + ObjetoAbstrato.NAO + " or  obj.produzido is null) ";
			}
			jaTemRestricao = true;
		}

		if (tipoPagamento !=  null ) {
			if(jaTemRestricao) {
				hql = hql + " and ";
			} else {
				hql = hql + " where ";
			}
			hql = hql + " obj.cliente.tipoPagamento = " + tipoPagamento;
			jaTemRestricao = true;
		}
		if (exibirCancelados !=  null ) {
			if(jaTemRestricao) {
				hql = hql + " and ";
			} else {
				hql = hql + " where ";
			}
			if (!exibirCancelados) {
				hql = hql + " obj.statusPedido.id <> " + StatusPedido.CANCELADO;
			}
			jaTemRestricao = true;
		}
		if (idCliente !=  null ) {
			if(jaTemRestricao) {
				hql = hql + " and ";
			} else {
				hql = hql + " where ";
			}
			hql = hql + " obj.cliente.id = :idCliente ";
			jaTemRestricao = true;
		}
		if (idPedido !=  null ) {
			if(jaTemRestricao) {
				hql = hql + " and ";
			} else {
				hql = hql + " where ";
			}
			hql = hql + " obj.id = :idPedido ";
			jaTemRestricao = true;
		}
		if (idUsuario !=  null ) {
			if(jaTemRestricao) {
				hql = hql + " and ";
			} else {
				hql = hql + " where ";
			}
			hql = hql + " obj.usuario.id = :idUsuario ";
			jaTemRestricao = true;
		}
		if (idStatusPedido !=  null ) {
			if(jaTemRestricao) {
				hql = hql + " and ";
			} else {
				hql = hql + " where ";
			}
			hql = hql + " obj.statusPedido.id = :idStatusPedido ";
			jaTemRestricao = true;
		}
		if (dataCadastroInicial !=  null ) {
			if(jaTemRestricao) {
				hql = hql + " and ";
			} else {
				hql = hql + " where ";
			}
			hql = hql + " obj.dataCadastro >= :dataCadastroInicial";
			jaTemRestricao = true;
		}
		if (dataCadastroFinal !=  null ) {
			if(jaTemRestricao) {
				hql = hql + " and ";
			} else {
				hql = hql + " where ";
			}
			hql = hql + " obj.dataCadastro <= :dataCadastroFinal";
			jaTemRestricao = true;
		}

		if (dataEntregaInicial !=  null ) {
			if(jaTemRestricao) {
				hql = hql + " and ";
			} else {
				hql = hql + " where ";
			}
			hql = hql + " obj.dataEntrega >= :dataEntregaInicial ";
			jaTemRestricao = true;
		}
		if (dataEntregaFinal !=  null ) {
			if(jaTemRestricao) {
				hql = hql + " and ";
			} else {
				hql = hql + " where ";
			}
			hql = hql + " obj.dataEntrega <= :dataEntregaFinal ";
			jaTemRestricao = true;
		}

		hql = hql + " order by obj.id desc ";

		Query q = createQuery(hql);
		if (idCliente !=  null ) {
			q.setParameter("idCliente", idCliente);
		}
		if (idUsuario !=  null ) {
			q.setParameter("idUsuario", idUsuario);
		}
		if (idPedido !=  null ) {
			q.setParameter("idPedido", idPedido);
		}
		if (idStatusPedido !=  null ) {
			q.setParameter("idStatusPedido", idStatusPedido);
		}
		if (dataCadastroInicial !=  null ) {
			Calendar cal = Calendar.getInstance();
			cal.setTime(dataCadastroInicial);
			cal.set(Calendar.HOUR_OF_DAY,0);
			cal.set(Calendar.MINUTE,0);
			cal.set(Calendar.SECOND,0);
			dataCadastroInicial = cal.getTime();
			q.setParameter("dataCadastroInicial", dataCadastroInicial);
		}
		if (dataCadastroFinal !=  null ) {
			Calendar cal = Calendar.getInstance();
			cal.setTime(dataCadastroFinal);
			cal.set(Calendar.HOUR_OF_DAY,23);
			cal.set(Calendar.MINUTE,59);
			cal.set(Calendar.SECOND,59);
			dataCadastroFinal = cal.getTime();
			q.setParameter("dataCadastroFinal", dataCadastroFinal);
		}

		if (dataEntregaInicial !=  null ) {
			Calendar cal = Calendar.getInstance();
			cal.setTime(dataEntregaInicial);
			cal.set(Calendar.HOUR_OF_DAY,0);
			cal.set(Calendar.MINUTE,0);
			cal.set(Calendar.SECOND,0);
			dataEntregaInicial = cal.getTime();
			q.setParameter("dataEntregaInicial", dataEntregaInicial);
		}
		if (dataEntregaFinal !=  null ) {
			Calendar cal = Calendar.getInstance();
			cal.setTime(dataEntregaFinal);
			cal.set(Calendar.HOUR_OF_DAY,23);
			cal.set(Calendar.MINUTE,59);
			cal.set(Calendar.SECOND,59);
			dataEntregaFinal = cal.getTime();
			q.setParameter("dataEntregaFinal", dataEntregaFinal);
		}

		List<Pedido> lista = q.getResultList();
		return lista;
	}

	public Pedido consultarUltimoPedidos(Long idCliente) {

		String hql = " from "+Pedido.class.getSimpleName()+" obj where obj.cliente.id = :idCliente";

		hql = hql + " order by obj.id ";

		Query q = createQuery(hql);
		if (idCliente !=  null ) {
			q.setParameter("idCliente", idCliente);
		}

		Pedido retorno = null;
		List<Pedido> lista = q.getResultList();
		for(Pedido p:lista) {
			if (retorno == null || retorno.getId() < p.getId()) {
				retorno = p;
			}
		}
		
		if (retorno != null && retorno.getCliente() != null && retorno.getCliente().getResgataUltimoPedido() != null && retorno.getCliente().getResgataUltimoPedido().equals(ObjetoAbstrato.NAO)) {
			retorno = null;
		}


		return retorno;
	}

}
